/*!
 * \file IDataManager.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 数据管理接口定义
 * \details 定义了数据管理模块的核心接口，提供各种市场数据的获取和管理功能
 */
#pragma once
#include "../Includes/WTSTypes.h"

NS_WTP_BEGIN
class WTSTickSlice;
class WTSKlineSlice;
class WTSTickData;
class WTSOrdQueSlice;
class WTSOrdDtlSlice;
class WTSTransSlice;

/**
 * @class IDataManager
 * @brief 数据管理接口
 * @details 数据管理模块的核心接口，提供各种市场数据的获取和管理功能。
 *          主要功能包括：
 *          - tick数据切片获取
 *          - Level2数据（委托队列、委托明细、成交明细）切片获取
 *          - K线数据切片获取
 *          - 最新tick数据获取
 *          - 复权因子获取
 *          
 *          该接口是数据管理模块的核心，由具体的数据管理实现类继承。
 *          所有方法都提供了默认实现（返回NULL或默认值），具体实现可以根据需要重写。
 */
class IDataManager
{
public:
	/**
	 * @brief 获取tick数据切片
	 * @details 根据指定的合约代码、数量和结束时间获取tick数据切片。
	 * 
	 * @param stdCode 标准合约代码
	 * @param count 获取的tick数据数量
	 * @param etime 结束时间（Unix时间戳），默认为0表示获取最新数据
	 * @return WTSTickSlice* tick数据切片指针，默认返回NULL
	 */
	virtual WTSTickSlice* get_tick_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) { return NULL; }
	
	/**
	 * @brief 获取委托队列数据切片
	 * @details 根据指定的合约代码、数量和结束时间获取委托队列数据切片。
	 *          委托队列数据属于Level2市场数据，包含买卖档位的详细委托信息。
	 * 
	 * @param stdCode 标准合约代码
	 * @param count 获取的委托队列数据数量
	 * @param etime 结束时间（Unix时间戳），默认为0表示获取最新数据
	 * @return WTSOrdQueSlice* 委托队列数据切片指针，默认返回NULL
	 */
	virtual WTSOrdQueSlice* get_order_queue_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) { return NULL; }
	
	/**
	 * @brief 获取委托明细数据切片
	 * @details 根据指定的合约代码、数量和结束时间获取委托明细数据切片。
	 *          委托明细数据属于Level2市场数据，包含每笔委托的详细信息。
	 * 
	 * @param stdCode 标准合约代码
	 * @param count 获取的委托明细数据数量
	 * @param etime 结束时间（Unix时间戳），默认为0表示获取最新数据
	 * @return WTSOrdDtlSlice* 委托明细数据切片指针，默认返回NULL
	 */
	virtual WTSOrdDtlSlice* get_order_detail_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) { return NULL; }
	
	/**
	 * @brief 获取成交明细数据切片
	 * @details 根据指定的合约代码、数量和结束时间获取成交明细数据切片。
	 *          成交明细数据属于Level2市场数据，包含每笔成交的详细信息。
	 * 
	 * @param stdCode 标准合约代码
	 * @param count 获取的成交明细数据数量
	 * @param etime 结束时间（Unix时间戳），默认为0表示获取最新数据
	 * @return WTSTransSlice* 成交明细数据切片指针，默认返回NULL
	 */
	virtual WTSTransSlice* get_transaction_slice(const char* stdCode, uint32_t count, uint64_t etime = 0) { return NULL; }
	
	/**
	 * @brief 获取K线数据切片
	 * @details 根据指定的合约代码、周期、倍数、数量和结束时间获取K线数据切片。
	 * 
	 * @param stdCode 标准合约代码
	 * @param period K线周期类型（如分钟、小时、日线等）
	 * @param times 周期倍数（如5分钟线的times为5）
	 * @param count 获取的K线数据数量
	 * @param etime 结束时间（Unix时间戳），默认为0表示获取最新数据
	 * @return WTSKlineSlice* K线数据切片指针，默认返回NULL
	 */
	virtual WTSKlineSlice* get_kline_slice(const char* stdCode, WTSKlinePeriod period, uint32_t times, uint32_t count, uint64_t etime = 0) { return NULL; }

	/**
	 * @brief 获取最新tick数据
	 * @details 获取指定合约的最新tick数据，通常用于获取实时行情信息。
	 * 
	 * @param stdCode 标准合约代码
	 * @return WTSTickData* 最新tick数据指针，默认返回NULL
	 */
	virtual WTSTickData* grab_last_tick(const char* stdCode) { return NULL; }

	/**
	 * @brief 获取复权因子
	 * @details 获取指定合约在指定日期的复权因子，用于股票等需要复权处理的品种。
	 *          复权因子用于调整历史价格数据，以反映除权除息等事件的影响。
	 * 
	 * @param stdCode 标准合约代码
	 * @param uDate 日期，格式为yyyyMMdd
	 * @return double 复权因子，默认返回1.0（不复权）
	 */
	virtual double get_adjusting_factor(const char* stdCode, uint32_t uDate) { return 1.0; }
};

NS_WTP_END
